package com.doc.gen;

import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.util.ArrayList;

/**
 * 数据库文档生成工具
 *
 * @author tanghailan
 * @date 2021年11月29日 20:02
 * @author—Email tanghailan@outlook.com
 * @blogURL https://blog.csdn.net/qq_42979402
 * @description
 */
@SpringBootTest
public class ScrewUtil {
  /** 文档生成 */
  @Test
  public void documentGeneration() {
    String fileOutputDir = "/Users/tanghailan/Desktop/codeman/doc";

    // 数据源
    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); // 数据库启动（此处是 Postgresql 数据库驱动）
    hikariConfig.setJdbcUrl(
        "jdbc:mysql://127.0.0.1:3306/codeman?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false");
    hikariConfig.setUsername("root");
    hikariConfig.setPassword("");
    // 设置可以获取tables remarks信息
    hikariConfig.addDataSourceProperty("useInformationSchema", "true");
    hikariConfig.setMinimumIdle(2);
    hikariConfig.setMaximumPoolSize(5);
    DataSource dataSource = new HikariDataSource(hikariConfig);

    // 生成配置
    EngineConfig engineConfig =
        EngineConfig.builder()
            // 生成文件路径
            .fileOutputDir(fileOutputDir)
            // 打开目录
            .openOutputDir(true)
            // 文件类型
            // .fileType(EngineFileType.HTML) // 生成 HTML 文档
            .fileType(EngineFileType.WORD) // 生成 WORD文档
            // .fileType(EngineFileType.MD)        //生成 Markdown 文档
            // 生成模板实现
            .produceType(EngineTemplateType.freemarker)
            // 自定义文件名称
            .fileName("数据库设计文档 V1.0")
            .build();

    // 指定表名
    ArrayList<String> designatedTableName = new ArrayList<>();
    //designatedTableName.add("yzt_people_data");
    //designatedTableName.add("yzt_sbss_house");
    //designatedTableName.add("yzt_zjj_buildings");
    // 忽略表
    ArrayList<String> ignoreTableName = new ArrayList<>();
    // ignoreTableName.add("test_user");
    // ignoreTableName.add("test_group");
    // 忽略表前缀
    ArrayList<String> ignorePrefix = new ArrayList<>();
    // ignorePrefix.add("test_");
    // 忽略表后缀
    ArrayList<String> ignoreSuffix = new ArrayList<>();
    // ignoreSuffix.add("_test");
    ProcessConfig processConfig =
        ProcessConfig.builder()
            // 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时，将生成指定表，其余表不生成、并跳过忽略表配置
            // 根据名称指定表生成
                .designatedTableName(designatedTableName)
            // 根据表前缀生成
            .designatedTablePrefix(new ArrayList<>())
            // 根据表后缀生成
            .designatedTableSuffix(new ArrayList<>())
            // 忽略表名
            .ignoreTableName(ignoreTableName)
            // 忽略表前缀
            .ignoreTablePrefix(ignorePrefix)
            // 忽略表后缀
            .ignoreTableSuffix(ignoreSuffix)
            .build();
    // 配置
    Configuration config =
        Configuration.builder()
            // 版本
            .version("1.0.0")
            // 描述
            .description("数据库设计文档 V1.0")
            // 数据源
            .dataSource(dataSource)
            // 生成配置
            .engineConfig(engineConfig)
            // 生成配置
            .produceConfig(processConfig)
            .build();
    // 执行生成
    new DocumentationExecute(config).execute();
  }
}
